import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

class ScrollNotoficationTestRoute extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _ScrollNotificationTestRouteState();
}

class _ScrollNotificationTestRouteState
    extends State<ScrollNotoficationTestRoute> {
  String _progress = '0%'; //保存进度百分比

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Material(
      child: new Scaffold(
          appBar: new AppBar(
            title: new Text('NotificationListener'),
          ),
          body: new Scrollbar(
            //进度条
            //监听滚动通知
            child: new NotificationListener<ScrollNotification>(
              onNotification: (ScrollNotification notification) {
                double progress = notification.metrics.pixels /
                    notification.metrics.maxScrollExtent;
                // 重新构建
                setState(() {
                  _progress = '${(progress * 100).toInt()}%';
                });
                print('bottomEdge: ${notification.metrics.extentAfter == 0}');
                //return true; //放开此行注释，进度条将失效
              },
              child: Stack(
                alignment: Alignment.center,
                children: <Widget>[
                  new ListView.builder(
                    itemCount: 100,
                    itemExtent: 50,
                    itemBuilder: (context, int index) {
                      return ListTile(
                        title: Text('$index'),
                      );
                    },
                  ),
                  new CircleAvatar(
                    //显示进度百分比
                    radius: 30,
                    child: new Text(_progress),
                    backgroundColor: Colors.black54,
                  ),
                  // new ClipRRect(
                  //   borderRadius: BorderRadius.circular(30),
                  //   child: new Container(
                  //     width: 60,
                  //     height: 60,
                  //     color: Colors.black54,
                  //     child: new Center(
                  //       child: new Text(_progress, style: TextStyle(color: Colors.white),),
                  //     ),
                  //   )
                  // )
                ],
              ),
            ),
          )),
    );
  }
}
/*
在接收到滚动事件时，参数类型为ScrollNotification，它包括一个metrics属性，它的类型是ScrollMetrics，该属性包含当前ViewPort及滚动位置等信息：

pixels：当前滚动位置。
maxScrollExtent：最大可滚动长度。
extentBefore：滑出ViewPort顶部的长度；此示例中相当于顶部滑出屏幕上方的列表长度。
extentInside：ViewPort内部长度；此示例中屏幕显示的列表部分的长度。
extentAfter：列表中未滑入ViewPort部分的长度；此示例中列表底部未显示到屏幕范围部分的长度。
atEdge：是否滑到了Scrollable Widget的边界（此示例中相当于列表顶或底部）。
ScrollMetrics还有一些其它属性，读者可以自行查阅API文档。
*/
